package br.com.divulgaqui.managedbean;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.divulgaqui.client.PacoteAnuncioServiceBeanLocal;
import br.com.divulgaqui.client.VendaServiceBeanLocal;
import br.com.divulgaqui.client.exception.PacoteAnuncioPublicadoException;
import br.com.divulgaqui.client.exception.ValoPacoteAnuncioException;
import br.com.divulgaqui.entity.PacoteAnuncio;
import br.com.divulgaqui.entity.Pessoa;

import com.ocpsoft.pretty.faces.annotation.URLAction;
import com.ocpsoft.pretty.faces.annotation.URLMapping;
import com.ocpsoft.pretty.faces.annotation.URLMappings;

@ManagedBean
@ViewScoped
@URLMappings(mappings={
		  @URLMapping(id = "cadastroPacoteAnuncio", pattern = "/admin/pacote-anuncio/cadastro", viewId = "/admin/pacoteAnuncio/cadastro.jsf"),
		  @URLMapping(id = "pacotesClientes", pattern = "/pacotes", viewId = "/principal/pacotes.jsf"),
		  @URLMapping(id = "confirmacao", pattern = "/cliente/confirmacao", viewId = "/principal/cliente/confirmacao.jsf"),
		  @URLMapping(id = "vendasCliente", pattern = "/cliente/area/pacotes", viewId = "/principal/cliente/pacotes.jsf")
})
public class PacoteAnuncioManagedBean extends BaseBean{
	
	private static final long serialVersionUID = 1L;
	
	private PacoteAnuncio pacoteAnuncio;
	private PacoteAnuncio pacoteAnuncioSelecionado;
	private List<PacoteAnuncio> pacotesAnuncios;	
	@ManagedProperty(name="loginManagedBean",value="#{loginManagedBean}")
	private LoginManagedBean loginManagedBean;	
	@EJB
	private PacoteAnuncioServiceBeanLocal pacoteAnuncioServiceBeanLocal;
	@EJB
	private VendaServiceBeanLocal vendaServiceBeanLocal;
	
	
	public PacoteAnuncioManagedBean(){		
	}
	
	@PostConstruct
	public void init(){
		pacoteAnuncio = new PacoteAnuncio();
		pacoteAnuncioSelecionado = new PacoteAnuncio();
		setPacotesAnuncios(new ArrayList<PacoteAnuncio>());	
	}
	
	/**
	 * Salva um pacote de anuncios
	 */
	public void salvar(){
		try {
			pacoteAnuncioServiceBeanLocal.salvar(pacoteAnuncio);
			addMensagem(FacesMessage.SEVERITY_INFO, "Pacote Anuncio", "Pacote de anuncio cadastrado com sucesso.");
			pacoteAnuncio = new PacoteAnuncio();
			carregarPacotesAnuncios();
		} catch (ValoPacoteAnuncioException e) {
			addMensagem(FacesMessage.SEVERITY_ERROR, "Pacote Anuncio", "Valor do pacote vazio ou <= 0.");
		}		
	}
	
	/**
	 * Publica um pacote de anuncio
	 */
	public void publicar(){
		pacoteAnuncioServiceBeanLocal.publicar(pacoteAnuncioSelecionado);
		carregarPacotesAnuncios();
		addMensagem(FacesMessage.SEVERITY_INFO, "Pacote Anuncio", "Pacote de anuncio publicado com sucesso.");
	}
	
	public void desativar(){
		pacoteAnuncioServiceBeanLocal.desativar(pacoteAnuncioSelecionado);
		carregarPacotesAnuncios();
		addMensagem(FacesMessage.SEVERITY_INFO, "Pacote Anuncio", "Pacote de anuncio desativado com sucesso.");
	}
	
	/**
	 * Exclui um pacote de anuncio
	 */
	public void excluir(){
		try {
			pacoteAnuncioServiceBeanLocal.excluir(pacoteAnuncioSelecionado);
			carregarPacotesAnuncios();
			addMensagem(FacesMessage.SEVERITY_INFO, "Pacote Anuncio", "Pacote de anuncio excluído com sucesso.");
		} catch (PacoteAnuncioPublicadoException e) {
			addMensagem(FacesMessage.SEVERITY_ERROR, "Pacote Anuncio", "Pacote publicado não deve ser excluído");
		}		
	}
	
	/**
	 * Lista todos os pacotes de anuncios
	 */
	@URLAction(mappingId="cadastroPacoteAnuncio",onPostback=false)
	public void carregarPacotesAnuncios(){
		pacotesAnuncios = pacoteAnuncioServiceBeanLocal.listar();
	}
	
	/**
	 * Lista todos os pacotes de anuncios publicados
	 */
	@URLAction(mappingId="pacotesClientes",onPostback=false)
	public void carregarPacotesCliente(){
		pacotesAnuncios = pacoteAnuncioServiceBeanLocal.listaPacotesPublicos();
	}
	
	/**
	 * Relaciona o cliente com o pacote comprado
	 * @throws IOException
	 */
	public void salvarPacoteCliente() throws IOException{
		FacesContext context = FacesContext.getCurrentInstance();
		if(loginManagedBean == null || loginManagedBean.getPessoa() == null){			
			context.getExternalContext().redirect("/divulgaqui/login");
		}
		Pessoa pessoa = loginManagedBean.getPessoa();		
		vendaServiceBeanLocal.efetuarVenda(pessoa, pacoteAnuncioSelecionado, pacoteAnuncioSelecionado.getQtdComprado());
		context.getExternalContext().redirect("/divulgaqui/cliente/confirmacao");
	}
	
	//====================== Get e Set ====================//

	public PacoteAnuncio getPacoteAnuncio() {
		return pacoteAnuncio;
	}

	public void setPacoteAnuncio(PacoteAnuncio pacoteAnuncio) {
		this.pacoteAnuncio = pacoteAnuncio;
	}

	public PacoteAnuncio getPacoteAnuncioSelecionado() {
		return pacoteAnuncioSelecionado;
	}

	public void setPacoteAnuncioSelecionado(PacoteAnuncio paconteAnuncioSelecionado) {
		this.pacoteAnuncioSelecionado = paconteAnuncioSelecionado;
	}

	public List<PacoteAnuncio> getPacotesAnuncios() {
		return pacotesAnuncios;
	}

	public void setPacotesAnuncios(List<PacoteAnuncio> pacotesAnuncios) {
		this.pacotesAnuncios = pacotesAnuncios;
	}

	public LoginManagedBean getLoginManagedBean() {
		return loginManagedBean;
	}

	public void setLoginManagedBean(LoginManagedBean loginManagedBean) {
		this.loginManagedBean = loginManagedBean;
	}
}
